# 一、元组
a = (1, '2', [3])
print(a, type(a))
b = ()
print(b)
# 只包含一个元素时，不是元组了,可能是当成括号了,可以加一个逗号变成元组
c = (1)
print(c, type(c))
d = (1,)
print(d, type(d))

# 数据不能修改
print(a[0])
# a[0] = 2

# 拆包：
# 方法一：元组内有几个元素，就要定义几个变量
item1, item2, item3 = a
print(item1, item2, item3)
# 方法二：使用*进行拆包，得到一个list
item1, *item2 = a
print(item1, item2)

# 应用场景
# 1、函数的参数和返回值，一个函数可以接收到多个参数，或者一次返回多个数据
# 2、格式化输出
info = ('jueyi', 18)
print('%s的年龄是%d' % info)

# 二、字典
dic = {
    'name': 'jueyi',
    'age': 18,
}
print(dic, type(dic))
print(dic['age'], dic.get('age'), dic.get('name1'), dic.get('name2', '不存在'))

# 键重复时，后面的会覆盖前面的值
dic2 = {
    'sex': '男',
    'name': 'jueyi',
    'name': 'test'
}
print(dic2)

# 键存在则修改，不存在则增加
dic2['name'] = 'jueyi'
dic2['age'] = 18
print(dic2)

# del删除元素
del dic2['name']
print(dic2)
# 清空整个字典
dic2.clear()
print(dic2)
# del删除整个字典
del dic2
# print(dic2)

# len(): 查看字典长度
dic3 = {
    'name': 'jueyi',
    'age': 18,
    'sex': 'male',
    'addr': 'dalian'
}
print(len(dic3))

# keys(): 返回键名的列表
print(dic3.keys(), type(dic3.keys()))
# values(): 返回值的列表
print(dic3.values(), type(dic3.values()))
# items(): 返回（键，值）的元组列表
print(dic3.items(), type(dic3.items()))
# 通过循环取键
for i in dic3:
    print(i, end=' ')
print('')
for i in dic3.keys():
    print(i, end=' ')
print('')
# 通过循环取值
for i in dic3:
    print(dic3[i], end=' ')
print('')
for i in dic3.values():
    print(i, end=' ')
print('')
# 通过循环取键和值
for k, v in dic3.items():
    print(k, v, end=' ')
print('')

# 三、集合
# 集合的元素是无序且唯一的
set1 = {2, 1, 3, 4, 2, 1, 2, 3}
print(set1, type(set1))

# 可以用集合来给元组或者列表去重
list = [1, 2, 2, 3, 4, 4]
print(set(list))

# 增加元素
# add():添加的是一个整体
set1.add((5, 6))
# 不能加list
# set1.add([5,6])
print(set1)

# update():把传入的元素拆分，一个一个放入集合中
set1.update([5, 6])
set1.update('8910')
set1.update(('a', 'b'))
# update()的参数必须是能够循环迭代的
# set1.update(567)
print(set1)

# 删除元素
# remove():有则删除，无则报错
set1.remove((5, 6))
print(set1)
# pop(): 对集合进行无序的排序，将左边第一个元素删除并返回
el = set1.pop()
print(el, set1)
# discard(): 有则删除，无则不操作
set1.discard('0')
print(set1)

# 交集和并集
set2 = {2, 3, 4, 8, 9}
print(set1 & set2)
# 没有交集返回空的set
res = set1 & {66}
print(res, type(res), len(res))
print(set1 | set2)
